home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_08_01
/
8n01054a
< prev
next >
Wrap
Text File
|
1990-02-18
|
2KB
|
77 lines
*****Coeff_Cubic (Listing 1)*****
void coeff_cubic (a,p,q,x,y,lambda,k)
/*
* Set up the equations for the Hermite cubic approximation.
*/
double *a,*x,*y,*lambda;
int p,q,k;
{
double d,alpha,beta,d3,alpha3;
int i,j,col;
for (i=0; i<p; i++)
{
j = interval (lambda,x[i],k);
col = SUB(i,2*(j-1),q);
d = lambda[j] - lambda[j-1];
alpha = x[i]-lambda[j-1];
beta = d-alpha;
d3 = d*d*d;
alpha3 = alpha*alpha*alpha;
*(a+col) = (d3-3.0*d*alpha*alpha+2.0*alpha3)/d3;
*(a+col+1) = d*alpha*beta*beta/d3;
*(a+col+2) = (3.0*d-2.0*alpha)*alpha*alpha/d3;
*(a+col+3) = -d*alpha*alpha*beta/d3;
}
}
int interval (x,v,n)
/*
* Given a value v find the interval j such that v is in the interval
* x[j-1] to x[j], where x is an increasing set of n values.
*/
double x[],v;
int n;
{
int j = 0, found = 0;
if (v == x[0]) return(1);
while (!found && ++j<n)
found =( v<=x[j] && v> x[j-1]) ? 1:0;
return(j);
}
double app_cubic (x,j,lambda,res)
/*
* Given the result res[] from the routine Hermite() find the value
* of y for the given x value.
*/
double x,*lambda,*res;
int j;
{
double d,alpha,beta,d3,alpha3,sum,val[4];
int i,col;
col = 2*(j-1);
d = lambda[j] - lambda[j-1];
alpha = x-lambda[j-1];
beta = d-alpha;
d3 = d*d*d;
alpha3 = alpha*alpha*alpha;
val[0] = (d3-3.0*d*alpha*alpha+2.0*alpha3)/d3;
val[1] = d*alpha*beta*beta/d3;
val[2] = (3.0*d-2.0*alpha)*alpha*alpha/d3;
val[3] = -d*alpha*alpha*beta/d3;
for (sum=0.0,i=0; i<4; i++) sum += val[i]*res[col+i];
return (sum);
}